iT邦幫忙

2022 iThome 鐵人賽

DAY 5
0
Web 3

Smart-Contract Language: Move系列 第 7

Day 7 Control Flow

  • 分享至 

  • xImage
  •  

在 Move 中,我們可以使用 while、loop、if 表達式來控制運行代碼

if 表達式

if 表達式,允許在某些條件為 true 時運行特定代碼,反之亦然。

特別注意,只要是表達式就必須以分號結尾,可以返回一個值。

script {
    use 0x1::Debug;

    fun main() {

        let a = true;

        if (a) {
            // do A
        } else {
            // do B
        }; // 需加上分號
    }
}

while 表達式

while 表達式,是一種定義循環的方法,在某些條件為 true 時執行。

需要加上分號,不能返回一個值。

script {
    fun main() {

        let i = 0; // define counter

        // iterate while i < 5
        // on every iteration increase i
        // when i is 5, condition fails and loop exits
        while (i < 5) {
            i = i + 1;
        };
    }
}

無限 loop

當無限 loop 發生時,大多數情況下,編譯器無法阻止發布,代碼的執行將持續消耗所有給定的資源 (所謂的區塊鏈術語 - gas)。

因此,需要多加小心撰寫的程式碼,或是使用更安全的 while

script {
    fun main() {
        let i = 0;

        loop {
            i = i + 1;
        }

        let _ = i;
    }
}

執行上面這段程式,會出現此 Error
Execution failed because of an out of gas error in script at code offset 11

控制迴路 continue 和 break

continue: 分別跳過一輪

break: 中斷迭代

script {
    fun main() {
        let i = 0;

        loop {
            i = i + 1;

            if (i / 2 == 0) continue; // 如果是偶數,跳過此輪
            if (i == 5) break; // 如果等於 5,中斷 loop 迴圈

            // do something here
         };

        0x1::Debug::print<u8>(&i); // debug: 5
    }
}

有條件的 abort

需要自行終止事務的執行,可以使用關鍵字 abort ,允許後面的程式碼終止執行。

script {
    fun main(a: u8) {

        if (a != 10) {
            abort 0;
        }

        // code here won't be executed if a != 10
        // transaction aborted
    }
}

使用 assert 內置

使用關鍵字 assert 來宣告包含 abort + 條件,當不滿足條件時,將終止執行,反之不會執行任何操作。

schema

assert!(<bool expression>, <code>)

example

script {

    fun main(a: u8) {
        assert!(a == 10, 0);

        // code here will be executed if (a == 10)
    }
}

使用控制流程時,需小心是否寫出無限 loop,讓我們 Move to Day8


上一篇
Day 6 Function
下一篇
Day 8 Tuple and Unit
系列文
Smart-Contract Language: Move30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言